﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;

namespace itau.im.gerador.utilitario
{
    public class EmailSender
    {
        #region Atributos

        private string _assunto;
        private string _remetente;
        private string _servidorSMTP;
        private string _mensagem;
        private string _mensagemAdvertencia;
        
        private IList<string> _destinatarios;
        private Queue<string> _filaMensagens;

        #endregion

        #region Construtor

        public EmailSender(string servidorSMTP, string mensagemAdvertencia, string assunto, string mensagem, string remetente, params string[] destinatarios)
        {
            _filaMensagens = new Queue<string>();

            _servidorSMTP = servidorSMTP;
            _assunto = assunto;
            _mensagem = mensagem;
            _mensagemAdvertencia = mensagemAdvertencia;
            _remetente = remetente;
            _destinatarios = destinatarios;
        }

        #endregion

        #region Métodos Públicos

        public void AdicionarLinhaCorpoMensagem(string mensagem)
        {
            _filaMensagens.Enqueue(mensagem);
        }

        public void EnviarEmail()
        {
            if (_filaMensagens.Count > 0)
            {
                try
                {
                    using (MailMessage mailMessage = new MailMessage())
                    {
                        if (_destinatarios != null && _destinatarios.Count() > 0)
                        {
                            foreach (string destinatario in _destinatarios)
                            {
                                mailMessage.To.Add(new MailAddress(destinatario));
                            }
                        }
                        else
                        {
                            throw new Exception("Erro ao enviar email: a lista de destinatários não deve ser nula ou vazia.");
                        }

                        mailMessage.From = new MailAddress(this._remetente);
                        mailMessage.Subject = this._assunto;
                        mailMessage.IsBodyHtml = true;
                        mailMessage.Body = this.FormatarMensagemEmail();

                        SmtpClient smtpClient = new SmtpClient(this._servidorSMTP);
                        smtpClient.Send(mailMessage);
                    }
                }
                catch(Exception ex)
                {
                    throw new Exception("Erro ao enviar email.", ex);
                }
            }
        }

        #endregion

        #region Métodos Privados

        private string FormatarMensagemEmail()
        {
            StringBuilder sbMensagem = new StringBuilder();

            sbMensagem.Append(@"<font size='2' face='Arial'>");

            if (!string.IsNullOrEmpty(this._mensagemAdvertencia))
            {
                sbMensagem.Append(string.Format("<i><b>{0}</b></i>", this._mensagemAdvertencia));
                sbMensagem.Append("<br>");
            }

            if (!string.IsNullOrEmpty(this._mensagem))
            {
                sbMensagem.Append(this._mensagem);
                sbMensagem.Append("<br>");
            }

            while(_filaMensagens.Count > 0)
            {
                sbMensagem.Append("<br>");
                sbMensagem.Append(this._filaMensagens.Dequeue());
            }

            sbMensagem.Append("</font>");

            return sbMensagem.ToString();
        }

        #endregion
    }
}
